1
var office = {
  fnlist:{},
  listen: function(key,fn){
    if(!this.fnlist[key]){
       this.fnlist[key] = []
    }
    this.fnlist[key].push(fn)
  },
  trigger: function(){
    var key = Array.prototype.shift.call(arguments),
        fnArr = this.fnlist[key];
    if(!fnArr || fnArr.length===0){
       
       return false
    }
    for(var i =0,fn;fn=fnArr[i++];){
         fn.apply(this,arguments)
    }
  }
}

使用

office.listen('a',function(data){console.log(data)})
office.trigger('a',"我就是数据")
//输出 我就是数据

发布订阅模式的通用实现
修改下之前的代码

var event= {
  fnlist:{},
  listen: function(key,fn){
    if(!this.fnlist[key]){
       this.fnlist[key] = []
    }
    this.fnlist[key].push(fn)
  },
  trigger: function(){
    var key = Array.prototype.shift.call(arguments),
        fnArr = this.fnlist[key];
    if(!fnArr || fnArr.length===0){
       
       return false
    }
    for(var i =0,fn;fn=fnArr[i++];){
         fn.apply(this,arguments)
    }
  }
}

js是一门解释之行的语言,给对象动态欠佳职责是很简单的事情

我们需要一个installEvent方法

var installEvent = function(obj){
     for(var i in event){
      obj[i] = event[i]
    }
}

需要让一个对象 有 发布订阅功能
只需要

var a = {}
installEvent(a);
// a 对象就有了效果

最普通的一个
301 声望41 粉丝

永远不要做你擅长的事。